package com.Tjise.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class TestDriver {

    public static void main(String[] args) {
        System.out.println("=============================");
        test03();

    }

    /**
     * jdbc连接数据库操作
     */
    public static void test03() {
        // 创建一个查询器的实例对象
        DBProvider dbProvider = new DBProvider();
        //        (4) 准备数据库的SQL语句，用于处理业务逻辑；
        String strSql = "select * from books";
        //        (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
        List<Map<String, Object>> listMap = dbProvider.queryListMap(strSql);

        //        (6) 遍历List+Map结果集对象，获取数据库中的数据，进行相关的业务逻辑处理；
        for (Map<String, Object> map : listMap) {
            // 遍历map
            Set<String> setKeys = map.keySet();
            for (String strKey : setKeys) {
                System.out.print("   " + map.get(strKey));
            }
            //换行
            System.out.println();
        }
    }


    /**
     * jdbc连接数据库操作
     */
    public static void test02() {
        try {
            // 创建一个查询器的实例对象
            DBProvider dbProvider = new DBProvider();
            //        (4) 准备数据库的SQL语句，用于处理业务逻辑；
            String strSql = "select * from books";
            //        (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            ResultSet resultSet = dbProvider.query(strSql);

            //        (6) 遍历ResultSet结果集对象，获取数据库中的数据，进行相关的业务逻辑处理；
            if (resultSet != null) {
                while (resultSet.next()) {
                    // 从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2)); // 数据操作相关的下标都是从1开始的，而不是从0开始的；
                }
            }
            System.out.println("--------------------------------");
            // 将游标指针重新放置到第一行数据集之前，最开始的位置
            resultSet.beforeFirst();
            // 遍历结果集
            if (resultSet != null) {
                while (resultSet.next()) {
                    // 从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2)); // 数据操作相关的下标都是从1开始的，而不是从0开始的；
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * jdbc连接数据库操作
     */
    public static void test01() {

        // (0) 准备数据库连接的相关参数
        // 数据库的驱动类的名字 包路径名
        String strDriverName4Mysql8 = "com.mysql.cj.jdbc.Driver";
        String strDriverName4Mysql5 = "com.mysql.jdbc.Driver";
        String strDriverName4Oracle = "oracle.jdbc.driver.OracleDriver";

        // 数据库服务器的连接串
        // 连接串中的 localhost 127.0.0.1 ip地址 服务器名 表示服务器的访问路径  3306 mysql数据库服务器监听的端口号
        String strURL4Mysql8 = "jdbc:mysql://localhost:3306/book_manage?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
        String strURL4Mysql5 = "jdbc:mysql://localhost:3306/book_manage?useUnicode=true&characterEncoding=utf8";
        String strURL4Oracle = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 表示Oracle数据库安装的实例名，默认是orcl，如果不是默认，则改成自己的

        // 登录数据库的用户名和密码
        String strUserName = "root";
        String strUserPsw = "root";

        try {
            //        (1) 加载数据库驱动类；【使用反射】
            // 如果jvm中没有数据库驱动类Driver实例对象，会自动根据连接串类型进行加载数据库驱动类的实例.
            // Class.forName(strDriverName4Mysql8); // 这一行可以不用写，jvm会自动加载
            //        (2) 通过DriverManager类的静态方法获取数据库的连接对象Connection；
            Connection connection = DriverManager.getConnection(strURL4Mysql8, strUserName, strUserPsw);
            //        (3) 通过数据库连接对象获取查询器 Statement ；
            Statement statement = connection.createStatement();
            //        (4) 准备数据库的SQL语句，用于处理业务逻辑；
            String strSql = "select * from books";
            //        (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            ResultSet resultSet = statement.executeQuery(strSql);
            //        (6) 遍历ResultSet结果集对象，获取数据库中的数据，进行相关的业务逻辑处理；
            if (resultSet != null) {
                while (resultSet.next()) {
                    // 从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2)); // 数据操作相关的下标都是从1开始的，而不是从0开始的；
                }
            }
            System.out.println("--------------------------------");
            // 将游标指针重新放置到第一行数据集之前，最开始的位置
            resultSet.beforeFirst();
            // 关闭连接
            //connection.close();

            if (resultSet != null) {
                while (resultSet.next()) {
                    // 从ResultSet中取出当前游标遍历行的数据
                    System.out.println(resultSet.getObject(2)); // 数据操作相关的下标都是从1开始的，而不是从0开始的；
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
